home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 001-100 / 001-025 / 008 / src / savelev.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  3KB  |  147 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* savelev.h version 1.0.1 - also save engravings from MKLEV */
  3.  
  4. #include "hack.h"
  5. #include <stdio.h>
  6. extern struct monst *restmonchn();
  7. extern struct obj *restobjchn();
  8. extern struct obj *billobjs;
  9. extern char *itoa();
  10.  
  11. extern char nul[];
  12. #ifndef NOWORM
  13. #include    "def.wseg.h"
  14.  
  15. extern struct wseg *wsegs[32], *wheads[32];
  16. extern long wgrowtime[32];
  17. #endif NOWORM
  18.  
  19. savelev(fd){
  20. #ifndef NOWORM
  21.     register struct wseg *wtmp, *wtmp2;
  22.     register int tmp;
  23. #endif NOWORM
  24.  
  25.     if(fd < 0)
  26.            panic("Save on bad file!");
  27.  
  28.     bwrite(fd,(char *) levl,sizeof(levl));
  29.     bwrite(fd,(char *) &moves,sizeof(long));
  30.     bwrite(fd,(char *) &xupstair,sizeof(xupstair));
  31.     bwrite(fd,(char *) &yupstair,sizeof(yupstair));
  32.     bwrite(fd,(char *) &xdnstair,sizeof(xdnstair));
  33.     bwrite(fd,(char *) &ydnstair,sizeof(ydnstair));
  34.     savemonchn(fd, fmon);
  35.     savegenchn(fd, fgold);
  36.     savegenchn(fd, ftrap);
  37.     saveobjchn(fd, fobj);
  38.     saveobjchn(fd, billobjs);
  39. /*    if (!ismklev) */
  40.        billobjs = 0;
  41.     save_engravings(fd);
  42. #ifndef QUEST
  43.     bwrite(fd,(char *) rooms,sizeof(rooms));
  44.     bwrite(fd,(char *) doors,sizeof(doors));
  45. #endif QUEST
  46. /*     if (!ismklev) */
  47.        {
  48.        fgold = ftrap = 0;
  49.        fmon = 0;
  50.        fobj = 0;
  51.        }
  52. /*--------------------------------------------------------------------*/
  53. #ifndef NOWORM
  54.     bwrite(fd,(char *) wsegs,sizeof(wsegs));
  55.     for(tmp=1; tmp<32; tmp++){
  56.         for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){
  57.             wtmp2 = wtmp->nseg;
  58.             bwrite(fd,(char *) wtmp,sizeof(struct wseg));
  59.         }
  60. /*        if (!ismklev) */
  61.            wsegs[tmp] = 0;
  62.     }
  63.     bwrite(fd,(char *) wgrowtime,sizeof(wgrowtime));
  64. #endif NOWORM
  65. /*--------------------------------------------------------------------*/
  66. }
  67.  
  68. bwrite(fd,loc,num)
  69. register int fd;
  70. register char *loc;
  71. register unsigned num;
  72. {
  73. /* lint wants the 3rd arg of write to be an int; lint -p an unsigned */
  74.     if(write(fd, loc, (int) num) != num)
  75.         panic("cannot write %d bytes to file #%d",num,fd);
  76. }
  77.  
  78. saveobjchn(fd,otmp)
  79. register int fd;
  80. register struct obj *otmp;
  81. {
  82.     register struct obj *otmp2;
  83.     unsigned xl;
  84.     int minusone = -1;
  85.  
  86.     while(otmp) {
  87.         otmp2 = otmp->nobj;
  88.         xl = otmp->onamelth;
  89.         bwrite(fd, (char *) &xl, sizeof(int));
  90.         bwrite(fd, (char *) otmp, xl + sizeof(struct obj));
  91. /*        if (!ismklev) */
  92.             free((char *) otmp);
  93.         otmp = otmp2;
  94.     }
  95.     bwrite(fd, (char *) &minusone, sizeof(int));
  96. }
  97.  
  98. savemonchn(fd,mtmp)
  99. register int fd;
  100. register struct monst *mtmp;
  101. {
  102.     register struct monst *mtmp2;
  103.     unsigned xl;
  104.     int minusone = -1;
  105.     int monnum;
  106. #ifdef FUNNYRELOC
  107.     struct permonst *monbegin = &mons[0];
  108.  
  109.     bwrite(fd, (char *) &monbegin, sizeof(monbegin));
  110. #endif
  111.  
  112.     while(mtmp) {
  113.         mtmp2 = mtmp->nmon;
  114.         xl = mtmp->mxlth + mtmp->mnamelth;
  115.         bwrite(fd, (char *) &xl, sizeof(int));
  116.  
  117.         /* JAT - just save the offset into the monster table, */
  118.         /* it will be relocated when read in */
  119.         monnum = mtmp->data - &mons[0];
  120.         mtmp->data = (struct permonst *)monnum;
  121. #ifdef DEBUGMON
  122.         myprintf("Wrote monster #%d", monnum);
  123. #endif
  124.         bwrite(fd, (char *) mtmp, xl + sizeof(struct monst));
  125.         if(mtmp->minvent) saveobjchn(fd,mtmp->minvent);
  126. /*        if (!ismklev) */
  127.            free((char *) mtmp);
  128.         mtmp = mtmp2;
  129.     }
  130.     bwrite(fd, (char *) &minusone, sizeof(int));
  131. }
  132.  
  133. savegenchn(fd,gtmp)
  134. register int fd;
  135. register struct gen *gtmp;
  136. {
  137.     register struct gen *gtmp2;
  138.     while(gtmp) {
  139.         gtmp2 = gtmp->ngen;
  140.         bwrite(fd, (char *) gtmp, sizeof(struct gen));
  141. /*        if (!ismklev) */
  142.            free((char *) gtmp);
  143.         gtmp = gtmp2;
  144.     }
  145.     bwrite(fd, nul, sizeof(struct gen));
  146. }
  147.